From 880c32ae06180c9973f55f789dfb1e6d4c9032f4 Mon Sep 17 00:00:00 2001 From: "awilliam@lappy" Date: Tue, 20 Jun 2006 16:21:13 -0600 Subject: [PATCH] [IA64] purge stale tlb entry in ia64_do_page_fault() fix ia64_do_page_fault(). When it determines to again, it might remains stale entry in tlb entry hoping next tlb imsert may purge it. But if reflects faults, the stale entry remains. it must be purged. Signed-off-by: Isaku Yamahata --- xen/arch/ia64/xen/faults.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/xen/arch/ia64/xen/faults.c b/xen/arch/ia64/xen/faults.c index dfda9af4d7..eb4e6091c8 100644 --- a/xen/arch/ia64/xen/faults.c +++ b/xen/arch/ia64/xen/faults.c @@ -215,6 +215,8 @@ void ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_reg unsigned long pteval; unsigned long is_data = !((isr >> IA64_ISR_X_BIT) & 1UL); IA64FAULT fault; + int is_ptc_l_needed = 0; + u64 logps; if ((isr & IA64_ISR_IR) && handle_lazy_cover(current, regs)) return; if ((isr & IA64_ISR_SP) @@ -232,7 +234,6 @@ void ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_reg again: fault = vcpu_translate(current,address,is_data,&pteval,&itir,&iha); if (fault == IA64_NO_FAULT || fault == IA64_USE_TLB) { - u64 logps; struct p2m_entry entry; pteval = translate_domain_pte(pteval, address, itir, &logps, &entry); vcpu_itc_no_srlz(current,is_data?2:1,address,pteval,-1UL,logps); @@ -242,11 +243,18 @@ void ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_reg matching. Undo the work. */ vcpu_flush_tlb_vhpt_range(address & ((1 << logps) - 1), logps); + + // the stale entry which we inserted above + // may remains in tlb cache. + // we don't purge it now hoping next itc purges it. + is_ptc_l_needed = 1; goto again; } return; } + if (is_ptc_l_needed) + vcpu_ptc_l(current, address, logps); if (!user_mode (regs)) { /* The fault occurs inside Xen. */ if (!ia64_done_with_exception(regs)) { -- 2.30.2